Simon Elsässer, Karolinska Institutet (2023)

Profile plots of promoters, enhancders and significant peaks determined by DESeq2.

bw_dir <- "/Volumes/DATA/DATA/Puck/bigwig/"

library("wigglescout")
library("ggpubr")
library("ggplot2")
library("DESeq2")
library("dplyr")
library("ggrastr")

clean <- function (fn) {
  fn <- gsub(pattern = ".+/", "", x = fn)
  fn <- gsub(pattern = ".mm9.+", "", x = fn)
  fn <- gsub(pattern = ".mm39.+", "", x = fn)
  fn <- gsub(pattern = "_S.+", "", x = fn)
  fn <- gsub(pattern = "_combined.+", "", x = fn)
  fn <- gsub(pattern = "G4 CnT ", "", x = fn)
  fn <- gsub(pattern = "_batch2", "", x = fn)
  fn <- gsub(pattern = "-", " ", x = fn)
  fn <- gsub(pattern = "_", " ", x = fn)
  fn <- gsub(pattern = " HA ", " ", x = fn)
  fn <- gsub(pattern = "D1D6", "FANCJ-/-", x = fn)
  fn <- gsub(pattern = "P2D2", "DHX36-/-", x = fn)
  fn <- gsub(pattern = "P3D4", "FANCJ-/-DHX36-/-", x = fn)
  return(fn)
}

BWs <- paste0(bw_dir,list.files(bw_dir,pattern="G4_.+_combined.bw"))

mypal <-c("cornflowerblue","orange","red2","#505050")
mypal3 <-c("cornflowerblue","cornflowerblue","cornflowerblue","orange","orange","orange","red2","red","red2","black","black","black")
mypal2 <-c("cornflowerblue","cornflowerblue","orange","orange","red2","red","black","black")

DHX36-/- vs WT significant peaks

FANCJ-/- vs WT significant peaks

DKO-/- vs WT significant peaks

DKO-/- vs WT significant peaks

MACS peak intersect not called in WT

#non-significant Peaks

Active Promoters

Active Enhancers

ggsave("plots/profile_G4_DHX36.pdf",plot_profile_G4_DHX36,width = 3, height= 3)
ggsave("plots/profile_G4_FANCJ.pdf",plot_profile_G4_FANCJ,width = 3, height= 3)
ggsave("plots/profile_G4_DKO.pdf",plot_profile_G4_DKO,width = 3, height= 3)
ggsave("plots/profile_G4_nonsig.pdf",plot_profile_G4_nonsig,width = 3, height= 3)
ggsave("plots/profile_G4_ProAct.pdf",plot_profile_G4_proact,width = 3, height= 3)
ggsave("plots/profile_G4_ProBiv.pdf",plot_profile_G4_probiv,width = 3, height= 3)
ggsave("plots/profile_G4_EnhAct.pdf",plot_profile_G4_enhact,width = 3, height= 3)

Heatmaps

ggsave("panels/heatmap_G4.pdf",plot_heatmap_G4,width = 6, height= 3)

p <- ggdraw() +
  draw_plot(plot_profile_G4_DHX36, x = 0, y = 0, width = .33, height = 1) +
  draw_plot(plot_profile_G4_nonsig, x = .33, y = 0, width = .33, height = 1) +
  draw_plot(plot_profile_G4_enhact, x = 0.66, y = 0, width = .33, height = 1)
p

ggsave("panels/profiles_G4_peak_enh.pdf",p,width=8, height=3)

p <- ggdraw() +
  draw_plot(plot_heatmap_G4, x = .0, y = 0, width = .5, height = 1) +
  draw_plot(plot_profile_G4_DHX36, x = .5, y = 0.5, width = .25, height = .5) +
  draw_plot(plot_profile_G4_FANCJ, x = .5, y = 0, width = .25, height = .5) +
  draw_plot(plot_profile_G4_DKO, x = .75, y = 0.5, width = .25, height = .5) +
  draw_plot(plot_profile_G4_nonsig, x = 0.75, y = 0, width = .25, height = .5)
p

ggsave("panels/heatmap_G4_peaks.pdf",p,width=8, height=3)

p <- ggdraw() +
  draw_plot(plot_heatmap_G4, x = .0, y = 0, width = .5, height = 1) +
  draw_plot(plot_profile_G4_DKO, x = .5, y = 0.5, width = .25, height = .5) +
  draw_plot(plot_profile_G4_nonsig, x = .5, y = 0, width = .25, height = .5) +
  draw_plot(plot_profile_G4_proact, x = .75, y = 0.5, width = .25, height = .5) +
  draw_plot(plot_profile_G4_enhact, x = 0.75, y = 0, width = .25, height = .5)
p

ggsave("panels/heatmap_G4_peaks_pro_enh.pdf",p,width=8, height=3)

R loops

ggsave("plots/profile_Rloop_DHX36.pdf",plot_profile_Rloop_DHX36,width = 3, height= 3)
ggsave("plots/profile_Rloop_FANCJ.pdf",plot_profile_Rloop_FANCJ,width = 3, height= 3)
ggsave("plots/profile_Rloop_DKO.pdf",plot_profile_Rloop_DKO,width = 3, height= 3)
ggsave("plots/profile_Rloop_nonsig.pdf",plot_profile_Rloop_nonsig,width = 3, height= 3)

p <- ggdraw() +
  draw_plot(plot_heatmap_Rloop, x = .0, y = 0, width = .5, height = 1) +
  draw_plot(plot_profile_Rloop_DHX36, x = .5, y = 0.5, width = .25, height = .5) +
  draw_plot(plot_profile_Rloop_FANCJ, x = .5, y = 0, width = .25, height = .5) +
  draw_plot(plot_profile_Rloop_DKO, x = .75, y = 0.5, width = .25, height = .5) +
  draw_plot(plot_profile_Rloop_nonsig, x = 0.75, y = 0, width = .25, height = .5)
p

ggsave("panels/peak_Rloop_heatmap.pdf",p,width=8, height=3)

p <- ggdraw() +
  draw_plot(plot_profile_Rloop_DHX36, x = 0, y = 0, width = .33, height = 1) +
  draw_plot(plot_profile_Rloop_DKO, x = .33, y = 0, width = .33, height = 1) +
  draw_plot(plot_profile_Rloop_nonsig, x = 0.66, y = 0, width = .33, height = 1)
p

ggsave("panels/peak_Rloop_profiles.pdf",p,width=8, height=3)
cov_proHi <- bw_loci(BWs, loci = "../genome/genes_hi_lt10kb.mm39.bed",labels = clean(BWs))

df <- as.data.frame(cov_proHi)[6:9]
colnames(df) <- c("FANCJ","DHX36","DKO","WT")
ggscatter(df,x ="WT",y="DKO",size = 0.8, alpha=0.5) + geom_abline(slope = 1, intercept = 0, linetype="dashed", size=0.1)
mdf <- melt(df)

ggviolin(mdf, x="variable",y="value",fill="variable",palette = mypal, add="mean_sd") +
  coord_cartesian(ylim=c(0,15))
LS0tCnRpdGxlOiAiRzQgQ1VUJlRhZyBhbmFseXNpcyBtRVNDIChXVCwgRkFOQ0ogS08sIERIWDM2IEtPLCBES08pIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpTaW1vbiBFbHPDpHNzZXIsIEthcm9saW5za2EgSW5zdGl0dXRldCAoMjAyMykKCiMjIyBQcm9maWxlIHBsb3RzIG9mIHByb21vdGVycywgZW5oYW5jZGVycyBhbmQgc2lnbmlmaWNhbnQgcGVha3MgZGV0ZXJtaW5lZCBieSBERVNlcTIuCgpgYGB7ciBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD0zfQpid19kaXIgPC0gIi9Wb2x1bWVzL0RBVEEvREFUQS9QdWNrL2JpZ3dpZy8iCgpsaWJyYXJ5KCJ3aWdnbGVzY291dCIpCmxpYnJhcnkoImdncHViciIpCmxpYnJhcnkoImdncGxvdDIiKQpsaWJyYXJ5KCJERVNlcTIiKQpsaWJyYXJ5KCJkcGx5ciIpCmxpYnJhcnkoImdncmFzdHIiKQoKY2xlYW4gPC0gZnVuY3Rpb24gKGZuKSB7CiAgZm4gPC0gZ3N1YihwYXR0ZXJuID0gIi4rLyIsICIiLCB4ID0gZm4pCiAgZm4gPC0gZ3N1YihwYXR0ZXJuID0gIi5tbTkuKyIsICIiLCB4ID0gZm4pCiAgZm4gPC0gZ3N1YihwYXR0ZXJuID0gIi5tbTM5LisiLCAiIiwgeCA9IGZuKQogIGZuIDwtIGdzdWIocGF0dGVybiA9ICJfUy4rIiwgIiIsIHggPSBmbikKICBmbiA8LSBnc3ViKHBhdHRlcm4gPSAiX2NvbWJpbmVkLisiLCAiIiwgeCA9IGZuKQogIGZuIDwtIGdzdWIocGF0dGVybiA9ICJHNCBDblQgIiwgIiIsIHggPSBmbikKICBmbiA8LSBnc3ViKHBhdHRlcm4gPSAiX2JhdGNoMiIsICIiLCB4ID0gZm4pCiAgZm4gPC0gZ3N1YihwYXR0ZXJuID0gIi0iLCAiICIsIHggPSBmbikKICBmbiA8LSBnc3ViKHBhdHRlcm4gPSAiXyIsICIgIiwgeCA9IGZuKQogIGZuIDwtIGdzdWIocGF0dGVybiA9ICIgSEEgIiwgIiAiLCB4ID0gZm4pCiAgZm4gPC0gZ3N1YihwYXR0ZXJuID0gIkQxRDYiLCAiRkFOQ0otLy0iLCB4ID0gZm4pCiAgZm4gPC0gZ3N1YihwYXR0ZXJuID0gIlAyRDIiLCAiREhYMzYtLy0iLCB4ID0gZm4pCiAgZm4gPC0gZ3N1YihwYXR0ZXJuID0gIlAzRDQiLCAiRkFOQ0otLy1ESFgzNi0vLSIsIHggPSBmbikKICByZXR1cm4oZm4pCn0KCkJXcyA8LSBwYXN0ZTAoYndfZGlyLGxpc3QuZmlsZXMoYndfZGlyLHBhdHRlcm49Ikc0Xy4rX2NvbWJpbmVkLmJ3IikpCgpteXBhbCA8LWMoImNvcm5mbG93ZXJibHVlIiwib3JhbmdlIiwicmVkMiIsIiM1MDUwNTAiKQpteXBhbDMgPC1jKCJjb3JuZmxvd2VyYmx1ZSIsImNvcm5mbG93ZXJibHVlIiwiY29ybmZsb3dlcmJsdWUiLCJvcmFuZ2UiLCJvcmFuZ2UiLCJvcmFuZ2UiLCJyZWQyIiwicmVkIiwicmVkMiIsImJsYWNrIiwiYmxhY2siLCJibGFjayIpCm15cGFsMiA8LWMoImNvcm5mbG93ZXJibHVlIiwiY29ybmZsb3dlcmJsdWUiLCJvcmFuZ2UiLCJvcmFuZ2UiLCJyZWQyIiwicmVkIiwiYmxhY2siLCJibGFjayIpCmBgYAoKIyMgREhYMzYtLy0gdnMgV1Qgc2lnbmlmaWNhbnQgcGVha3MKYGBge3IgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9MywgZXJyb3I9RixlY2hvPUYscHJvbXB0PUYsd2FybmluZz1GfQpwbG90X3Byb2ZpbGVfRzRfREhYMzYgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBCV3MsbG9jaSA9ICIuLi9wZWFrcy9HNF9DblRfY29tYmluZWRfcGVha3NfREVTZXFfREhYMzZfc2lnLmJlZCIsIG1vZGU9ImNlbnRlciIsIGxhYmVscyA9IGNsZWFuKEJXcyksc2hvd19lcnJvcj1ULGNvbG9ycyA9IG15cGFsLCB2ZXJib3NlPUYpICsgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDAsMTYpKQpwbG90X3Byb2ZpbGVfRzRfREhYMzYKYGBgCgoKIyMgRkFOQ0otLy0gdnMgV1Qgc2lnbmlmaWNhbnQgcGVha3MKYGBge3IgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9MywgZXJyb3I9RixlY2hvPUYscHJvbXB0PUYsd2FybmluZz1GfQpwbG90X3Byb2ZpbGVfRzRfRkFOQ0ogPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBCV3MsbG9jaSA9ICIuLi9wZWFrcy9HNF9DblRfY29tYmluZWRfcGVha3NfREVTZXFfRkFOQ0pfc2lnLmJlZCIsIG1vZGU9ImNlbnRlciIsIGxhYmVscyA9IGNsZWFuKEJXcyksc2hvd19lcnJvcj1ULGNvbG9ycyA9IG15cGFsLCB2ZXJib3NlPUYpICsgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDAsMTYpKQpwbG90X3Byb2ZpbGVfRzRfRkFOQ0oKYGBgCgojIyBES08tLy0gdnMgV1Qgc2lnbmlmaWNhbnQgcGVha3MKYGBge3IgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9MywgZXJyb3I9RixlY2hvPUYscHJvbXB0PUYsd2FybmluZz1GfQpwbG90X3Byb2ZpbGVfRzRfREtPIDwtIHBsb3RfYndfcHJvZmlsZShid2ZpbGVzID0gQldzLGxvY2kgPSAiLi4vcGVha3MvRzRfQ25UX2NvbWJpbmVkX3BlYWtzX0RFU2VxX0RLT19zaWcuYmVkIiwgbW9kZT0iY2VudGVyIiwgbGFiZWxzID0gY2xlYW4oQldzKSxzaG93X2Vycm9yPVQsY29sb3JzID0gbXlwYWwsIHZlcmJvc2U9RikgICsgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDAsMTYpKQpwbG90X3Byb2ZpbGVfRzRfREtPCmBgYAoKCiMjIERLTy0vLSB2cyBXVCBzaWduaWZpY2FudCBwZWFrcwpgYGB7ciBmaWcud2lkdGg9MywgZmlnLmhlaWdodD0zLCBlcnJvcj1GLGVjaG89Rixwcm9tcHQ9Rix3YXJuaW5nPUZ9CkJXcyA8LSBwYXN0ZTAoYndfZGlyLGxpc3QuZmlsZXMoYndfZGlyLHBhdHRlcm49Ikc0Xy4rX2NvbWJpbmVkLnVuaXF1ZS5idyIpKQpwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IEJXcyxsb2NpID0gIi4uL3BlYWtzL0c0X0NuVF9jb21iaW5lZF9wZWFrc19ERVNlcV9ES09fc2lnX2xmY19iYXNlX2N1dG9mZi5iZWQiLCBtb2RlPSJjZW50ZXIiLCBsYWJlbHMgPSBjbGVhbihCV3MpLHNob3dfZXJyb3I9VCxjb2xvcnMgPSBteXBhbCwgdmVyYm9zZT1GKSAgKyBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMCwxNikpCmBgYAoKIyMgTUFDUyBwZWFrIGludGVyc2VjdCBub3QgY2FsbGVkIGluIFdUCmBgYHtyIGZpZy53aWR0aD0zLCBmaWcuaGVpZ2h0PTMsIGVycm9yPUYsZWNobz1GLHByb21wdD1GLHdhcm5pbmc9Rn0KcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBCV3MsbG9jaSA9ICIuLi9wZWFrcy9HNF9jb21iaW5lZF9taW4zcmVwX25vdF9XVC5iZWQiLCBtb2RlPSJjZW50ZXIiLCBsYWJlbHMgPSBjbGVhbihCV3MpLHNob3dfZXJyb3I9VCxjb2xvcnMgPSBteXBhbCwgdmVyYm9zZT1GKQpgYGAKIyAjbm9uLXNpZ25pZmljYW50IFBlYWtzCmBgYHtyIGZpZy53aWR0aD0zLCBmaWcuaGVpZ2h0PTMsIGVycm9yPUYsZWNobz1GLHByb21wdD1GLHdhcm5pbmc9Rn0KcGxvdF9wcm9maWxlX0c0X25vbnNpZyA8LSBwbG90X2J3X3Byb2ZpbGUoYndmaWxlcyA9IEJXcyxsb2NpID0gIi4uL3BlYWtzL0c0X0NuVF9jb21iaW5lZF9wZWFrc19ERVNlcV9ub25zaWcuYmVkIiwgbW9kZT0iY2VudGVyIiwgbGFiZWxzID0gY2xlYW4oQldzKSxzaG93X2Vycm9yPVQsY29sb3JzID0gbXlwYWwsIHZlcmJvc2U9RikgICsgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDAsMTYpKQpwbG90X3Byb2ZpbGVfRzRfbm9uc2lnCmBgYAoKIyMgQWN0aXZlIFByb21vdGVycwpgYGB7ciBmaWcud2lkdGg9MywgZmlnLmhlaWdodD0zLCBlcnJvcj1GLGVjaG89Rixwcm9tcHQ9Rix3YXJuaW5nPUZ9CnBsb3RfcHJvZmlsZV9HNF9wcm9hY3QgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBCV3MsbG9jaSA9ICIuLi9nZW5vbWUvZ2VuZXNfaGlfMS0xMGtiLm1tMzkuYmVkIiwgbW9kZT0ic3RhcnQiLCBsYWJlbHMgPSBjbGVhbihCV3MpLHNob3dfZXJyb3I9VCxjb2xvcnMgPSBteXBhbCwgdmVyYm9zZT1GKQpwbG90X3Byb2ZpbGVfRzRfcHJvYWN0CmBgYApgYGB7ciBmaWcud2lkdGg9MywgZmlnLmhlaWdodD0zLCBlcnJvcj1GLGVjaG89Rixwcm9tcHQ9Rix3YXJuaW5nPUZ9CnBsb3RfcHJvZmlsZV9HNF9wcm9iaXYgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBCV3MsbG9jaSA9ICIuLi9nZW5vbWUvSzI3X2JpdmFsZW50X2dlbmVzLm1tMzkuYmVkIiwgbW9kZT0ic3RhcnQiLCBsYWJlbHMgPSBjbGVhbihCV3MpLHNob3dfZXJyb3I9VCxjb2xvcnMgPSBteXBhbCwgdmVyYm9zZT1GKSArIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygwLDE4KSkKcGxvdF9wcm9maWxlX0c0X3Byb2JpdgpgYGAKCiMjIEFjdGl2ZSBFbmhhbmNlcnMKYGBge3IgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9MywgZXJyb3I9RixlY2hvPUYscHJvbXB0PUYsd2FybmluZz1GfQpwbG90X3Byb2ZpbGVfRzRfZW5oYWN0IDwtIHBsb3RfYndfcHJvZmlsZShid2ZpbGVzID0gQldzLGxvY2kgPSAiLi4vZ2Vub21lL0VTQ19FbmhhbmNlcl9DcnV6TW9saW5hLmFjdGl2ZS5tbTM5LmJlZCIsIG1vZGU9ImNlbnRlciIsIGxhYmVscyA9IGNsZWFuKEJXcyksc2hvd19lcnJvcj1ULGNvbG9ycyA9IG15cGFsLCB2ZXJib3NlPUYpICsgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDAsMTYpKQpwbG90X3Byb2ZpbGVfRzRfZW5oYWN0CmBgYApgYGB7ciBmaWcud2lkdGg9MywgZmlnLmhlaWdodD0zLCBlcnJvcj1GLGVjaG89Rixwcm9tcHQ9Rix3YXJuaW5nPUZ9CnBsb3RfcHJvZmlsZV9HNF9lbmhwcmkgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBCV3MsbG9jaSA9ICIuLi9nZW5vbWUvRVNDX0VuaGFuY2VyX0NydXpNb2xpbmEucHJpbWVkLm1tMzkuYmVkIiwgbW9kZT0iY2VudGVyIiwgbGFiZWxzID0gY2xlYW4oQldzKSxzaG93X2Vycm9yPVQsY29sb3JzID0gbXlwYWwsIHZlcmJvc2U9RikgKyBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMCwxNikpCnBsb3RfcHJvZmlsZV9HNF9lbmhwcmkKYGBgCgpgYGB7ciBmaWcud2lkdGg9MywgZmlnLmhlaWdodD0zLCBlcnJvcj1GLGVjaG89Rixwcm9tcHQ9Rix3YXJuaW5nPUZ9CnBsb3RfcHJvZmlsZV9HNF9lbmhwb2kgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBCV3MsbG9jaSA9ICIuLi9nZW5vbWUvRVNDX0VuaGFuY2VyX0NydXpNb2xpbmEucG9pc2VkLm1tMzkuYmVkIiwgbW9kZT0iY2VudGVyIiwgbGFiZWxzID0gY2xlYW4oQldzKSxzaG93X2Vycm9yPVQsY29sb3JzID0gbXlwYWwsIHZlcmJvc2U9RikgKyBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMCwxNikpCnBsb3RfcHJvZmlsZV9HNF9lbmhwb2kKYGBgCgpgYGB7cn0KZ2dzYXZlKCJwbG90cy9wcm9maWxlX0c0X0RIWDM2LnBkZiIscGxvdF9wcm9maWxlX0c0X0RIWDM2LHdpZHRoID0gMywgaGVpZ2h0PSAzKQpnZ3NhdmUoInBsb3RzL3Byb2ZpbGVfRzRfRkFOQ0oucGRmIixwbG90X3Byb2ZpbGVfRzRfRkFOQ0osd2lkdGggPSAzLCBoZWlnaHQ9IDMpCmdnc2F2ZSgicGxvdHMvcHJvZmlsZV9HNF9ES08ucGRmIixwbG90X3Byb2ZpbGVfRzRfREtPLHdpZHRoID0gMywgaGVpZ2h0PSAzKQpnZ3NhdmUoInBsb3RzL3Byb2ZpbGVfRzRfbm9uc2lnLnBkZiIscGxvdF9wcm9maWxlX0c0X25vbnNpZyx3aWR0aCA9IDMsIGhlaWdodD0gMykKZ2dzYXZlKCJwbG90cy9wcm9maWxlX0c0X1Byb0FjdC5wZGYiLHBsb3RfcHJvZmlsZV9HNF9wcm9hY3Qsd2lkdGggPSAzLCBoZWlnaHQ9IDMpCmdnc2F2ZSgicGxvdHMvcHJvZmlsZV9HNF9Qcm9CaXYucGRmIixwbG90X3Byb2ZpbGVfRzRfcHJvYml2LHdpZHRoID0gMywgaGVpZ2h0PSAzKQpnZ3NhdmUoInBsb3RzL3Byb2ZpbGVfRzRfRW5oQWN0LnBkZiIscGxvdF9wcm9maWxlX0c0X2VuaGFjdCx3aWR0aCA9IDMsIGhlaWdodD0gMykKYGBgIAoKIyMjIEhlYXRtYXBzCgpgYGB7ciBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD0zLCBlcnJvcj1GLGVjaG89Rixwcm9tcHQ9Rix3YXJuaW5nPUZ9CmJlZF9zcmMgPC0gcmVhZC50YWJsZSgiLi4vcGVha3MvRzRfQ25UX2NvbWJpbmVkX3BlYWtzX0RFU2VxX3NpZ19jYXRlZ29yaWVzLmJlZCIsIGhlYWRlciA9IEYsIHNlcCA9ICJcdCIpCmgxIDwtIGJ3X2hlYXRtYXAoQldzWzRdLGxvY2k9Ii4uL3BlYWtzL0c0X0NuVF9jb21iaW5lZF9wZWFrc19ERVNlcV9zaWdfY2F0ZWdvcmllcy5iZWQiLCBtb2RlPSJjZW50ZXIiKQpvcmQgPC0gb3JkZXIoYmVkX3NyYyRWNSAqIDEwMDAgKyByb3dNZWFucyhoMVtbMV1dKSkKem1heCA8LSAzMApwMSA8LSBwbG90X2J3X2hlYXRtYXAoQldzWzRdLCIuLi9wZWFrcy9HNF9jb21iaW5lZF9taW4zcmVwLmJlZCIsIG1vZGU9ImNlbnRlciIsIHZlcmJvc2U9Rix6bWF4ID0gem1heCwgb3JkZXJfYnkgPSBvcmQpCnAyIDwtIHBsb3RfYndfaGVhdG1hcChCV3NbMl0sIi4uL3BlYWtzL0c0X2NvbWJpbmVkX21pbjNyZXAuYmVkIiwgbW9kZT0iY2VudGVyIiwgdmVyYm9zZT1GLHptYXggPSB6bWF4LCBvcmRlcl9ieSA9IG9yZCkKcDMgPC0gcGxvdF9id19oZWF0bWFwKEJXc1sxXSwiLi4vcGVha3MvRzRfY29tYmluZWRfbWluM3JlcC5iZWQiLCBtb2RlPSJjZW50ZXIiLCB2ZXJib3NlPUYsem1heCA9IHptYXgsIG9yZGVyX2J5ID0gb3JkKQpwNCA8LSBwbG90X2J3X2hlYXRtYXAoQldzWzNdLCIuLi9wZWFrcy9HNF9jb21iaW5lZF9taW4zcmVwLmJlZCIsIG1vZGU9ImNlbnRlciIsIHZlcmJvc2U9Rix6bWF4ID0gem1heCwgb3JkZXJfYnkgPSBvcmQpCmRmIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoYmVkX3NyYyRWNSkpCmRmJGNvbD0xCnA1IDwtIGdnYmFycGxvdChkZiwiY29sIiwiRnJlcSIsZmlsbD0iVmFyMSIsIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2socmV2ZXJzZSA9IFRSVUUpLCB3aWR0aCA9IDAuMSkgKyB0aGVtZV92b2lkKCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCnBsb3RfaGVhdG1hcF9HNCA8LSBnZ2FycmFuZ2UocDEscDIscDMscDQscDUsY29tbW9uLmxlZ2VuZCA9IFQsIG5jb2wgPSA1KQpwbG90X2hlYXRtYXBfRzQKYGBgCgpgYGB7cn0KZ2dzYXZlKCJwYW5lbHMvaGVhdG1hcF9HNC5wZGYiLHBsb3RfaGVhdG1hcF9HNCx3aWR0aCA9IDYsIGhlaWdodD0gMykKYGBgIAoKYGBge3IgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9M30KCnAgPC0gZ2dkcmF3KCkgKwogIGRyYXdfcGxvdChwbG90X3Byb2ZpbGVfRzRfREhYMzYsIHggPSAwLCB5ID0gMCwgd2lkdGggPSAuMzMsIGhlaWdodCA9IDEpICsKICBkcmF3X3Bsb3QocGxvdF9wcm9maWxlX0c0X25vbnNpZywgeCA9IC4zMywgeSA9IDAsIHdpZHRoID0gLjMzLCBoZWlnaHQgPSAxKSArCiAgZHJhd19wbG90KHBsb3RfcHJvZmlsZV9HNF9lbmhhY3QsIHggPSAwLjY2LCB5ID0gMCwgd2lkdGggPSAuMzMsIGhlaWdodCA9IDEpCnAKZ2dzYXZlKCJwYW5lbHMvcHJvZmlsZXNfRzRfcGVha19lbmgucGRmIixwLHdpZHRoPTgsIGhlaWdodD0zKQpgYGAKCgpgYGB7ciBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NX0KCnAgPC0gZ2dkcmF3KCkgKwogIGRyYXdfcGxvdChwbG90X2hlYXRtYXBfRzQsIHggPSAuMCwgeSA9IDAsIHdpZHRoID0gLjUsIGhlaWdodCA9IDEpICsKICBkcmF3X3Bsb3QocGxvdF9wcm9maWxlX0c0X0RIWDM2LCB4ID0gLjUsIHkgPSAwLjUsIHdpZHRoID0gLjI1LCBoZWlnaHQgPSAuNSkgKwogIGRyYXdfcGxvdChwbG90X3Byb2ZpbGVfRzRfRkFOQ0osIHggPSAuNSwgeSA9IDAsIHdpZHRoID0gLjI1LCBoZWlnaHQgPSAuNSkgKwogIGRyYXdfcGxvdChwbG90X3Byb2ZpbGVfRzRfREtPLCB4ID0gLjc1LCB5ID0gMC41LCB3aWR0aCA9IC4yNSwgaGVpZ2h0ID0gLjUpICsKICBkcmF3X3Bsb3QocGxvdF9wcm9maWxlX0c0X25vbnNpZywgeCA9IDAuNzUsIHkgPSAwLCB3aWR0aCA9IC4yNSwgaGVpZ2h0ID0gLjUpCnAKZ2dzYXZlKCJwYW5lbHMvaGVhdG1hcF9HNF9wZWFrcy5wZGYiLHAsd2lkdGg9MTAsIGhlaWdodD01KQpgYGAKCmBgYHtyIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD01fQoKcCA8LSBnZ2RyYXcoKSArCiAgZHJhd19wbG90KHBsb3RfaGVhdG1hcF9HNCwgeCA9IC4wLCB5ID0gMCwgd2lkdGggPSAuNSwgaGVpZ2h0ID0gMSkgKwogIGRyYXdfcGxvdChwbG90X3Byb2ZpbGVfRzRfREtPLCB4ID0gLjUsIHkgPSAwLjUsIHdpZHRoID0gLjI1LCBoZWlnaHQgPSAuNSkgKwogIGRyYXdfcGxvdChwbG90X3Byb2ZpbGVfRzRfbm9uc2lnLCB4ID0gLjUsIHkgPSAwLCB3aWR0aCA9IC4yNSwgaGVpZ2h0ID0gLjUpICsKICBkcmF3X3Bsb3QocGxvdF9wcm9maWxlX0c0X3Byb2FjdCwgeCA9IC43NSwgeSA9IDAuNSwgd2lkdGggPSAuMjUsIGhlaWdodCA9IC41KSArCiAgZHJhd19wbG90KHBsb3RfcHJvZmlsZV9HNF9lbmhhY3QsIHggPSAwLjc1LCB5ID0gMCwgd2lkdGggPSAuMjUsIGhlaWdodCA9IC41KQpwCmdnc2F2ZSgicGFuZWxzL2hlYXRtYXBfRzRfcGVha3NfcHJvX2VuaC5wZGYiLHAsd2lkdGg9MTAsIGhlaWdodD01KQpgYGAKCiMjIFIgbG9vcHMKCgpgYGB7ciBmaWcud2lkdGg9NCwgZmlnLmhlaWdodD00LCBlcnJvcj1GLGVjaG89Rixwcm9tcHQ9Rix3YXJuaW5nPUZ9CmJ3X2RpciA8LSAiL1ZvbHVtZXMvREFUQS9EQVRBL1B1Y2svYmlnd2lnLy8iCkJXc19SbG9vcCA8LSBwYXN0ZTAoYndfZGlyLGxpc3QuZmlsZXMoYndfZGlyLHBhdHRlcm49IlJsb29wXy4rX2NvbWJpbmVkLmJ3IikpCnBsb3RfcHJvZmlsZV9SbG9vcF9ES08gPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBCV3NfUmxvb3AsbG9jaSA9ICIuLi9wZWFrcy9HNF9DblRfY29tYmluZWRfcGVha3NfREVTZXFfREtPX3NpZy5iZWQiLCBtb2RlPSJjZW50ZXIiLCBsYWJlbHMgPSBjbGVhbihCV3NfUmxvb3ApLHNob3dfZXJyb3I9VCxjb2xvcnMgPSBteXBhbCwgdmVyYm9zZT1GKSArIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygwLDEwKSkKcGxvdF9wcm9maWxlX1Jsb29wX0RLTyAKYGBgCmBgYHtyIGZpZy53aWR0aD00LCBmaWcuaGVpZ2h0PTQsIGVycm9yPUYsZWNobz1GLHByb21wdD1GLHdhcm5pbmc9Rn0KcGxvdF9wcm9maWxlX1Jsb29wX0RIWDM2IDwtIHBsb3RfYndfcHJvZmlsZShid2ZpbGVzID0gQldzX1Jsb29wLGxvY2kgPSAiLi4vcGVha3MvRzRfQ25UX2NvbWJpbmVkX3BlYWtzX0RFU2VxX0RIWDM2X3NpZy5iZWQiLCBtb2RlPSJjZW50ZXIiLCBsYWJlbHMgPSBjbGVhbihCV3NfUmxvb3ApLHNob3dfZXJyb3I9VCxjb2xvcnMgPSBteXBhbCwgdmVyYm9zZT1GKSArIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygwLDEwKSkKcGxvdF9wcm9maWxlX1Jsb29wX0RIWDM2CmBgYAoKYGBge3IgZmlnLndpZHRoPTQsIGZpZy5oZWlnaHQ9NCwgZXJyb3I9RixlY2hvPUYscHJvbXB0PUYsd2FybmluZz1GfQpwbG90X3Byb2ZpbGVfUmxvb3BfRkFOQ0ogPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBCV3NfUmxvb3AsbG9jaSA9ICIuLi9wZWFrcy9HNF9DblRfY29tYmluZWRfcGVha3NfREVTZXFfRkFOQ0pfc2lnLmJlZCIsIG1vZGU9ImNlbnRlciIsIGxhYmVscyA9IGNsZWFuKEJXc19SbG9vcCksc2hvd19lcnJvcj1ULGNvbG9ycyA9IG15cGFsLCB2ZXJib3NlPUYpICsgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDAsMTApKQpwbG90X3Byb2ZpbGVfUmxvb3BfRkFOQ0oKYGBgCgpgYGB7ciBmaWcud2lkdGg9NCwgZmlnLmhlaWdodD00LCBlcnJvcj1GLGVjaG89Rixwcm9tcHQ9Rix3YXJuaW5nPUZ9CnBsb3RfcHJvZmlsZV9SbG9vcF9ub25zaWcgPC0gcGxvdF9id19wcm9maWxlKGJ3ZmlsZXMgPSBCV3NfUmxvb3AsbG9jaSA9ICIuLi9wZWFrcy9HNF9DblRfY29tYmluZWRfcGVha3NfREVTZXFfbm9uc2lnLmJlZCIsIG1vZGU9ImNlbnRlciIsIGxhYmVscyA9IGNsZWFuKEJXc19SbG9vcCksc2hvd19lcnJvcj1ULGNvbG9ycyA9IG15cGFsLCB2ZXJib3NlPUYpICsgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDAsMTApKQpwbG90X3Byb2ZpbGVfUmxvb3Bfbm9uc2lnCmBgYAoKYGBge3J9Cmdnc2F2ZSgicGxvdHMvcHJvZmlsZV9SbG9vcF9ESFgzNi5wZGYiLHBsb3RfcHJvZmlsZV9SbG9vcF9ESFgzNix3aWR0aCA9IDMsIGhlaWdodD0gMykKZ2dzYXZlKCJwbG90cy9wcm9maWxlX1Jsb29wX0ZBTkNKLnBkZiIscGxvdF9wcm9maWxlX1Jsb29wX0ZBTkNKLHdpZHRoID0gMywgaGVpZ2h0PSAzKQpnZ3NhdmUoInBsb3RzL3Byb2ZpbGVfUmxvb3BfREtPLnBkZiIscGxvdF9wcm9maWxlX1Jsb29wX0RLTyx3aWR0aCA9IDMsIGhlaWdodD0gMykKZ2dzYXZlKCJwbG90cy9wcm9maWxlX1Jsb29wX25vbnNpZy5wZGYiLHBsb3RfcHJvZmlsZV9SbG9vcF9ub25zaWcsd2lkdGggPSAzLCBoZWlnaHQ9IDMpCmBgYCAKCgpgYGB7ciBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD0zLCBlcnJvcj1GLGVjaG89Rixwcm9tcHQ9Rix3YXJuaW5nPUZ9Cgp6bWF4IDwtIDIwCgpyMSA8LSBwbG90X2J3X2hlYXRtYXAoQldzX1Jsb29wWzRdLCIuLi9wZWFrcy9HNF9DblRfY29tYmluZWRfcGVha3NfREVTZXFfc2lnX2NhdGVnb3JpZXMuYmVkIiwgbW9kZT0iY2VudGVyIiwgdmVyYm9zZT1GLHptYXggPSB6bWF4LCBvcmRlcl9ieSA9IG9yZCkKcjIgPC0gcGxvdF9id19oZWF0bWFwKEJXc19SbG9vcFsyXSwiLi4vcGVha3MvRzRfQ25UX2NvbWJpbmVkX3BlYWtzX0RFU2VxX3NpZ19jYXRlZ29yaWVzLmJlZCIsIG1vZGU9ImNlbnRlciIsIHZlcmJvc2U9Rix6bWF4ID0gem1heCwgb3JkZXJfYnkgPSBvcmQpCnIzIDwtIHBsb3RfYndfaGVhdG1hcChCV3NfUmxvb3BbMV0sIi4uL3BlYWtzL0c0X0NuVF9jb21iaW5lZF9wZWFrc19ERVNlcV9zaWdfY2F0ZWdvcmllcy5iZWQiLCBtb2RlPSJjZW50ZXIiLCB2ZXJib3NlPUYsem1heCA9IHptYXgsIG9yZGVyX2J5ID0gb3JkKQpyNCA8LSBwbG90X2J3X2hlYXRtYXAoQldzX1Jsb29wWzNdLCIuLi9wZWFrcy9HNF9DblRfY29tYmluZWRfcGVha3NfREVTZXFfc2lnX2NhdGVnb3JpZXMuYmVkIiwgbW9kZT0iY2VudGVyIiwgdmVyYm9zZT1GLHptYXggPSB6bWF4LCBvcmRlcl9ieSA9IG9yZCkKCnBsb3RfaGVhdG1hcF9SbG9vcCA8LSBnZ2FycmFuZ2UocjEscjIscjMscjQscDUsY29tbW9uLmxlZ2VuZCA9IFQsIG5jb2wgPSA1KQpnZ3NhdmUoInBhbmVscy9oZWF0bWFwX1Jsb29wLnBkZiIscGxvdF9oZWF0bWFwX1Jsb29wLHdpZHRoID0gNiwgaGVpZ2h0PSAzKQpwbG90X2hlYXRtYXBfUmxvb3AKYGBgCgpgYGB7ciBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NX0KCnAgPC0gZ2dkcmF3KCkgKwogIGRyYXdfcGxvdChwbG90X2hlYXRtYXBfUmxvb3AsIHggPSAuMCwgeSA9IDAsIHdpZHRoID0gLjUsIGhlaWdodCA9IDEpICsKICBkcmF3X3Bsb3QocGxvdF9wcm9maWxlX1Jsb29wX0RIWDM2LCB4ID0gLjUsIHkgPSAwLjUsIHdpZHRoID0gLjI1LCBoZWlnaHQgPSAuNSkgKwogIGRyYXdfcGxvdChwbG90X3Byb2ZpbGVfUmxvb3BfRkFOQ0osIHggPSAuNSwgeSA9IDAsIHdpZHRoID0gLjI1LCBoZWlnaHQgPSAuNSkgKwogIGRyYXdfcGxvdChwbG90X3Byb2ZpbGVfUmxvb3BfREtPLCB4ID0gLjc1LCB5ID0gMC41LCB3aWR0aCA9IC4yNSwgaGVpZ2h0ID0gLjUpICsKICBkcmF3X3Bsb3QocGxvdF9wcm9maWxlX1Jsb29wX25vbnNpZywgeCA9IDAuNzUsIHkgPSAwLCB3aWR0aCA9IC4yNSwgaGVpZ2h0ID0gLjUpCnAKZ2dzYXZlKCJwYW5lbHMvcGVha19SbG9vcF9oZWF0bWFwLnBkZiIscCx3aWR0aD0xMCwgaGVpZ2h0PTUpCmBgYAoKYGBge3IgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9M30KCnAgPC0gZ2dkcmF3KCkgKwogIGRyYXdfcGxvdChwbG90X3Byb2ZpbGVfUmxvb3BfREhYMzYsIHggPSAwLCB5ID0gMCwgd2lkdGggPSAuMzMsIGhlaWdodCA9IDEpICsKICBkcmF3X3Bsb3QocGxvdF9wcm9maWxlX1Jsb29wX0RLTywgeCA9IC4zMywgeSA9IDAsIHdpZHRoID0gLjMzLCBoZWlnaHQgPSAxKSArCiAgZHJhd19wbG90KHBsb3RfcHJvZmlsZV9SbG9vcF9ub25zaWcsIHggPSAwLjY2LCB5ID0gMCwgd2lkdGggPSAuMzMsIGhlaWdodCA9IDEpCnAKZ2dzYXZlKCJwYW5lbHMvcGVha19SbG9vcF9wcm9maWxlcy5wZGYiLHAsd2lkdGg9OCwgaGVpZ2h0PTMpCmBgYAoKCmBgYHtyIGZpZy53aWR0aD0yLCBmaWcuaGVpZ2h0PTJ9CmNvdl9wcm9IaSA8LSBid19sb2NpKEJXcywgbG9jaSA9ICIuLi9nZW5vbWUvZ2VuZXNfaGlfbHQxMGtiLm1tMzkuYmVkIixsYWJlbHMgPSBjbGVhbihCV3MpKQoKZGYgPC0gYXMuZGF0YS5mcmFtZShjb3ZfcHJvSGkpWzY6OV0KY29sbmFtZXMoZGYpIDwtIGMoIkZBTkNKIiwiREhYMzYiLCJES08iLCJXVCIpCmdnc2NhdHRlcihkZix4ID0iV1QiLHk9IkRLTyIsc2l6ZSA9IDAuOCwgYWxwaGE9MC41KSArIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCwgbGluZXR5cGU9ImRhc2hlZCIsIHNpemU9MC4xKQpgYGAKCmBgYHtyIGZpZy53aWR0aD0yLCBmaWcuaGVpZ2h0PTJ9Cm1kZiA8LSBtZWx0KGRmKQoKZ2d2aW9saW4obWRmLCB4PSJ2YXJpYWJsZSIseT0idmFsdWUiLGZpbGw9InZhcmlhYmxlIixwYWxldHRlID0gbXlwYWwsIGFkZD0ibWVhbl9zZCIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbT1jKDAsMTUpKQpgYGAK